/**
 * @file CPvmMasterCommands.hpp Deklarácia triedy CPvmMasterCommands.
 *
 * @author Martin Kosorinský.
 * @date 10.10.2009.
 */

#ifndef CPVMMASTERCOMMANDS_HEADER
#define CPVMMASTERCOMMANDS_HEADER

#include "CPvmCommands.hpp"

/**
 * @brief Trieda zapúzdrujúca komunikačné PVM príkazy pre server.
 */
class CPvmMasterCommands : public CPvmCommands {
public:
    /**
     * @brief Procedúra zabezpečujúca odoslanie parametrov eliptickej krivky a jej generátora.
     * Správa je odoslaná prostredníctom PVM adresátovi danému vstupným parametrom. Správa je označená
     * príznakom pvmMsgType::PVM_ECDLP_ECPARAMS, ktorý umožní jej spracovanie adresátom. Vstupné parametre procedúru
     * sú pred odoslaním spracované procedúrou #pvmPackBig. Celkovo je odosielaných 6 serializovaných štruktúr typu @c big.
     * @param[in] tid Identifikátor adresáta správy.
     * @param[in] a Koeficient eliptickej krivky.
     * @param[in] b Koeficient eliptickej krivky.
     * @param[in] p Modul eliptickej krivky.
     * @param[in] o Rád eliptickej krivky.
     * @param[in] g Odosielaný generátor.
     */
    static void pvmSendECParams(int tid, big a, big b, big p, big o, epoint * g);
    /**
     * @brief Procedúra zabezpečujúca odoslanie súradníc bodu, ktorého DL hľadáme.
     * Správa je odoslaná prostredníctom PVM adresátovi danému vstupným parametrom. Správa je označená
     * príznakom pvmMsgType::PVM_ECDLP_TASKPOINT, ktorý umožní jej spracovanie adresátom. Vstupné parametre procedúru
     * sú pred odoslaním spracované procedúrou #pvmPackBig.
     * @param[in] tid Identifikátor adresáta správy.
     * @param[in] P Odosielaný bod.
     */
    static void pvmSendTaskPoint(int tid, epoint * P);
    /**
     * @brief Procedúra extrahujúca distinguished bod a k nemu prislúchajúce hodnoty exponentov z PVM message bufferu.
     * Procedúra extrahuje z PVM bufferu pre príjem správ bod na eliptickej krivke a dva k nemu
     * prislúchajúce exponenty.
     * @param[in] P Alokovaná štruktúra pre uloženia prijatého @a distinguished bod.
     * @param[in] a Prvý exponent prislúchajúci k bodu @a P (viz. Brentov algoritmus).
     * @param[in] b Prvý exponent prislúchajúci k bodu @a P (viz. Brentov algoritmus).
     */
    static void pvmUnpackDistPoint(epoint * P, big a, big b);
    /**
     * @brief Procedúra extrahujúca hodnotu diskrétneho logaritmu z PVM message bufferu.
     * Procedúra zabezpečí extrahovanie hodnoty a jej uloženie. Prijatie tejto správy znamená koniec výpočtu
     * odosielateľa.
     * @param[out] d je vopred alokovaná štruktúra typu @c big, do ktorej bude uložená prijatá hodnota.
     */
    static void pvmUnpackDL(big d);
};
#endif /* CPVMMASTERCOMMANDS_HEADER */
